#include "PersonaV.h"

// harcodeado mal para prueba

PersonaV::PersonaV(){	
	//nombre=NULL;
	//apellido=NULL;
}

PersonaV* PersonaV::getNewInstance(){
	return(new PersonaV());

}

void PersonaV::clone(Dato* clon){
     char* naux= (char*)malloc(strlen(this->nombre)*sizeof(char));
     char* apaux= (char*)malloc(strlen(this->apellido)*sizeof(char));
      
     
     clon = new PersonaV(naux,apaux,this->dni);
}

PersonaV::PersonaV(char *nombre, char *apellido,char dni[]){
	int longNom;
	int longAp, longDni;
	
	
	this->nombre=(char*)malloc(strlen(nombre)*sizeof(char));
	this->apellido=(char*)malloc(strlen(apellido)*sizeof(char));
	
	strcpy(this->dni, dni);
	strcpy(this->nombre, nombre);
	strcpy(this->apellido, apellido);
	longNom = strlen(nombre);
	longAp =strlen(apellido);
	longDni = strlen(dni);

	
	this->tamanioBinario = 1 + longNom + 1 + longAp + 1 + longDni;
	this->tamanioTexto = 1+strlen(apellido)+1+strlen(nombre)+1+strlen(dni);;	
}

unsigned int PersonaV::getTamanio(TipoSerializacion modo){
	if (modo==BINARIO)
		return this->tamanioBinario;
	else
		return this->tamanioTexto;
}

int PersonaV::compareTo(Dato *datoAComparar){
	PersonaV *p = (PersonaV*) datoAComparar;
	return strcmp(dni,p->dni);
}

int PersonaV::compareToWith(Dato *datoAComparar, char** camposAComparar, int cantCamposAComparar){
	return 0;
}

void PersonaV::serialize(void **datoSerializado, TipoSerializacion modo){
	*datoSerializado = malloc(this->tamanioBinario);
	char *pos;
	pos = (char*) *datoSerializado;
	char tamDni = (char)strlen(this->dni);
	memmove(pos, (void*)tamDni, 1);
	pos= (char*)*datoSerializado +1;
	
	memmove(pos,this->dni,tamDni);
	pos = (char*) *datoSerializado + 1 + tamDni;
	
	char tamNom = (char)strlen(this->nombre);
	memmove(pos, (void*)tamNom, 1);
	pos= (char*)*datoSerializado +1 + tamDni +1;
	
	memmove(pos,this->nombre,tamNom);
	pos = (char*) *datoSerializado + 1 + tamDni + 1 + tamNom;
	
	char tamAp = (char)strlen(this->apellido);
	memmove(pos, (void*)tamAp, 1);
	pos = (char*) *datoSerializado + 1 + tamDni + 1 + tamNom + 1;
	
	
	memmove(pos,this->apellido,strlen(this->apellido));
	
}

void PersonaV::unserialize(void *datoADeserializar, TipoSerializacion modo){
	char *pos;
	pos = (char*) datoADeserializar;
	
	
	memmove(this->dni,pos,LONGDNI);
	pos = (char*) datoADeserializar + LONGDNI;
	int tam= strlen(this->nombre); 
	printf("tam= %d \n", tam);
	memmove(this->nombre,pos,/*strlen(this->nombre)*/tam);
	int tamA= strlen(this->apellido); printf("tamA= %d \n", tamA);
	
	pos = (char*) datoADeserializar + LONGDNI + /*strlen(this->nombre)*/tam;
	memmove(this->apellido,pos,/*strlen(this->apellido)*/tamA);
	return;
}

void PersonaV::print(){
	printf("%s %s %s",this->dni, this->nombre, this->apellido);
}

PersonaV::~PersonaV(){
	free(this->nombre);
	free(this->apellido);
}

